; int calcular_longitud_codificacion(unsigned int *tabla_apariciones, codigo_t *tabla_codigo);

%include "macros/codigo_t.mac" 

global calcular_longitud_codificacion

%define acum [ebp - 4]
%define ptr_tabla_apariciones [ebp + 8]
%define ptr_tabla_codigo [ebp + 12]

section .text

calcular_longitud_codificacion:
	push ebp
	mov ebp, esp
	sub esp, 4
	push esi
	push edi
	push ebx
	
	mov esi, ptr_tabla_apariciones ; esi = puntero de la tabla de apariciones.
	cmp esi, 0
	je error
	
	mov edi, ptr_tabla_codigo ; edi = puntero de la tabla de codigos.
	cmp edi, 0
	je error
	
	xor edx,edx
	xor eax,eax
	
	mov dword acum, 0
	mov ecx, 256 ; ecx = cantidad de elementos en la tabla de codigos.
	
ciclo:
	mov eax, [esi + ecx * 4 - 4] ; eax = # apariciones en pos actual.
	
	shl ecx, 4
	sub ecx, 16
	mov ebx, [edi + ecx + off_long_codigo_cod] ; ebx = codigo en la pos actual de tabla codigos. [edi + ecx * 16 - 16 + off_long_codigo_cod].
	add ecx, 16
	shr ecx, 4
	
	mul ebx ; Multiplico los actuales.
	add acum, eax ; Actualizo el acum + mul actual.
	jc error ; Si me pase del tamaño devuelvo error.
	
	loop ciclo
	
	mov eax, acum
	
	jmp fin
	
error:
	xor eax, eax
	
fin:
	pop ebx
	pop edi
	pop esi
	add esp, 4
	pop ebp
	ret
